package com.fxw.config;

import com.fxw.em.DatabaseType;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName DataSourceConfig
 * @Deacription 创建多个数据源实例,最后一个是通过动态路由的数据源，要使用的就是这个
 * @Author hqq
 * @Date 2021/10/25 21:53
 * @Version 1.0
 **/
@Configuration
public class DataSourceConfig {

    @Bean
    @Primary  //该注解表示在同一个接口有多个实现类可以注入的时候，默认选择哪一个，而不是让@autowire注解报错    主库
    @ConfigurationProperties("spring.datasource.master")
    public DataSource masterDataSource() {

        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.slave")   //从库
    public DataSource slaveDataSource() {

        return DataSourceBuilder.create().build();
    }

    //@Qualifier 根据名称进行注入，通常是在具有相同的多个类型的实例的一个注入
    @Bean
    public DataSource myRoutingDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
                                          @Qualifier("slaveDataSource") DataSource slaveDataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DatabaseType.MASTER, masterDataSource);
        targetDataSources.put(DatabaseType.SLAVE, slaveDataSource);
        MyRoutingDataSource myRoutingDataSource = new MyRoutingDataSource();
        myRoutingDataSource.setDefaultTargetDataSource(masterDataSource);
        myRoutingDataSource.setTargetDataSources(targetDataSources);   //目标数据源
        return myRoutingDataSource;
    }
}
